package com.test.launcher;

import com.test.exceptions.RouteDataException;
import com.test.storages.DataBase;
import com.test.utils.DataBaseUtils;
import com.test.utils.KeyUtils;
import com.test.utils.RouteUtils;

/**
 * Main
 * 
 * @author ezuccon
 * @category Launchers
 * @version 1.0
 * @since 12/03/2013
 */
public class Main {
	/**
	 * Constructor ocultio
	 */
	protected Main() {
		super();
	}

	/**
	 * Lanzador de la aplicacion
	 * 
	 * @param args
	 */
	public static void main(String[] args) {
		// genera la base de datos
		DataBase dataBase = DataBaseUtils.generateDataBase();

		// ejecuta el ejercicio 1
		Main.calculateRouteDistance(dataBase, "Ejercicio 1: ", "A-B-C");

		// ejecuta el ejercicio 2
		Main.calculateRouteDistance(dataBase, "Ejercicio 2: ", "A-D");

		// ejecuta el ejercicio 3
		Main.calculateRouteDistance(dataBase, "Ejercicio 3: ", "A-D-C");

		// ejecuta el ejercicio 4
		Main.calculateRouteDistance(dataBase, "Ejercicio 4: ", "A-E-B-C-D");

		// ejecuta el ejercicio 5
		Main.calculateRouteDistance(dataBase, "Ejercicio 5: ", "A-E-D");

		// ejecuta el ejercicio 6
		System.out.println("Ejercicio 6: "
				+ RouteUtils.getRoutesByMaxStop(dataBase, "C", "C", 2).size());

		// ejecuta el ejercicio 7
		System.out.println("Ejercicio 7: "
				+ RouteUtils.getRoutesByStop(dataBase, "A", "C", 4).size());

		// ejecuta el ejercicio 8
		System.out.println("Ejercicio 8: "
				+ RouteUtils.getRoutesByMinDistance(dataBase, "A", "C"));

		// ejecuta el ejercicio 9
		System.out.println("Ejercicio 9: "
				+ RouteUtils.getRoutesByMinDistance(dataBase, "B", "B"));

		// ejecuta el ejercicio 10
		System.out.println("Ejercicio 10: "
				+ RouteUtils.getRoutesByMaxDistance(dataBase, "C", "C", 30)
						.size());
	}

	/**
	 * Ejecuta el ejercicio 1
	 * 
	 * @param dataBase
	 */
	public static final void calculateRouteDistance(DataBase dataBase,
			String label, String route) {
		// obtiene la distancia de la ruta completa
		try {
			// info
			System.out.println(label
					+ RouteUtils.calculaRouteDistance(dataBase, route));
		} catch (RouteDataException rde) {
			// info error
			System.out.println(label + KeyUtils.WITHOUT_ROUTE);
		}
	}
}
